﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ABB.Robotics.Controllers;//控制器 
using ABB.Robotics.Controllers.Discovery;//搜索控制器
using ABB.Robotics.Controllers.RapidDomain;//程序
using ABB.Robotics.Controllers.EventLogDomain;//事件日志
using ABB.Robotics.Controllers.MotionDomain;// 机器关节坐标
using ABB.Robotics.Controllers.IOSystemDomain;// io相关 
using System.IO;



/// <summary>
///     上位机系统连接虚拟控制器业务事件的集合
/// </summary>

namespace ABB_last_end.module
{
    internal class ABB_connect
    {
        /// <summary>
        /// 上位机  操作员权限
        /// </summary>
        #region
        //创建ui类opr的实例化对象  静态对象 全局访问权限
        static opr opr1 = new opr();
        //创建 ui类 adm的实例化对象  
        static Administrator adm = new Administrator();
        //创建 ui类 登陆界面的实例化对象
        static main sign = new main();

        //登陆界面初始化
        public void sign_init()
        {
            sign.chB_opr.Checked = false;
            sign.chB_adr.Checked = true;
            sign.txB_account.Text = "";
            sign.txB_password.Text = "";
            sign.Show();
        }
    

        /// <summary>
        /// 上位机  业务事件  实例化对象  字段的集合
        /// </summary>
        #region
        //实例化两个对象 为 机器人网络扫描器 机器人控制器
        private NetworkScanner scanner = new NetworkScanner();
        private Controller controller = null;


        //机器人控制器rapid task 类实例化对象
        private ABB.Robotics.Controllers.RapidDomain.Task[] tasks = null;


        /// <summary>
        ///  信号初始化   上位机运行之前 ，请在工作站将一下信号名称权限设置为all
        /// </summary>
        #region
        //机器人工件 放置 排版 是否 合格 信号
        //Local_IO_DO01_Vac1ON  开始拾取  Local_IO_DO02_Vac1OFF 放置成功
        private Signal diPressureOK_s = null;

        //机器人 左手爪
        //do17Feed1PickFin  左        do26PlaceFinAlone 吸盘放下
        private DigitalSignal doVacuumOn_d = null;
        private Signal doVacuumOn_s = null;

        //机器人 右手爪 
        // do19Feed2PickFin  右   do26PlaceFinAlone 洗盘放下
        private Signal doAiron_s = null;
        private DigitalSignal doAirOn_d = null;
        private Signal count_Production = null;

        // 获取机器人控制器上所有的io信号 
        SignalCollection singnls_all = null;

        // 便捷设置信号io的值
        private Signal Set_io = null;
        private DigitalSignal Set_io_D = null;


        //机器人传送带上工件是否到位  信号  
        //di17Feed1PickAllow   di33Feed2PickAllow   工件到位否  都为1   到位
        private Signal Work_Tool_sig1 = null;
        private Signal Work_Tool_sig2 = null;

        // 工作站  夹具  信号
        // j1 夹具
        private Signal Jig_sig = null;

        // 电机  模式   工作站   运行状态信号
        //do02RobotCycleOn  do04RobotAutoMode    do00RobotMotorOn  都运行  工作站运行
        private Signal motor = null;
        private Signal models = null;
        private Signal working = null;
        #endregion

        //机器人程序数据rapiddata 实例化对象
        private RapidData p10Ra = null;
        //机器人程序数据robtarget类实例化对象 
        private RobTarget p10_Ro;

        //预防维护项目
        string maintenance;

       

        #endregion


        /// <summary>
        /// 上位机  系统 扫描 连接 机器人事件
        /// </summary>
        #region
        // 扫描当前端口网咯，然后显示出来 
        public void connect_refresh()
        {
            //方法scan 用于扫描网络并将所有控制器信息加载到内存
            scanner.Scan();
            opr1.lsV_opr.Items.Clear();

            ControllerInfoCollection controls = scanner.Controllers;

            foreach (ControllerInfo info in controls)
            {
                //将listviewitem类实例化一个对像 将info作为成员一
                ListViewItem item = new ListViewItem(info.SystemName);
                //将info属性ip地址   转换字符串类型 
                item.SubItems.Add(info.IPAddress.ToString());
                item.SubItems.Add(info.Version.ToString());
                item.SubItems.Add(info.IsVirtual.ToString());

                string a1 = DateTime.Now.ToString();
                item.SubItems.Add(a1);
                item.Tag = info;
                //将信息加载到ui上
                opr1.lsV_opr.Items.Add(item);
            }
            //显示信息到界面上去 
            opr1.Show();
        }

        // 点击虚拟控制器名称然后连接 
        public void connect_click_connect()
        {
            ListViewItem item = opr1.lsV_opr.SelectedItems[0];
            if (opr1.lsV_opr.Items.Count > 0)
            {
                if (item.Tag != null)
                {
                    ControllerInfo info = (ControllerInfo)item.Tag;
                    if (info.Availability == Availability.Available)
                    {
                        if (controller != null)
                        {
                            controller.Logoff();
                            controller.Dispose();
                            controller = null;
                            //如果contro 不为空 退出 在登陆
                        }
                        //  使用默认用户名登入 
                        controller = ControllerFactory.CreateFrom(info);
                        controller.Logon(UserInfo.DefaultUser);

                        MessageBox.Show("已成功登陆控制器" + info.SystemName);
                    }
                    else
                    {
                        MessageBox.Show("登陆失败");
                    }
                }
            }
            opr1.Show();
        }
        #endregion


        /// <summary>
        /// 上位机   启动电机 上电 下电  控制程序运行事件 
        /// </summary>
        #region
        //  启动
        public void connect_start()
        {
            try
            {
                if (controller.OperatingMode == ControllerOperatingMode.Auto)
                {
                    Jig_sig = controller.IOSystem.GetSignal("j1");
                    if (Jig_sig.Value.ToString() == "0")
                    {
                        //请求控制器权限
                        using (Mastership m = Mastership.Request(controller))
                        {
                            controller.Rapid.Start();
                        }
                        MessageBox.Show("启动");
                    }
                    else
                    {
                        MessageBox.Show("不符合启动位置");
                    }


                }
                else
                {
                    MessageBox.Show("当前处于手动模式！");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        //停止  
        public void connect_stop()
        {
            try
            {
                //请求控制器权限
                using (Mastership m = Mastership.Request(controller))
                {
                    controller.Rapid.Stop();
                }
                MessageBox.Show("停止");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        // 电机上电
        public void connect_power_on()
        {
            try
            {
                if (controller.OperatingMode == ControllerOperatingMode.Auto)
                {
                    controller.State = ControllerState.MotorsOn;
                    MessageBox.Show("上电成功");
                }
                else
                {
                    MessageBox.Show("请切换到自动模式");
                }

            }
            catch (System.Exception ex)
            {
                MessageBox.Show("异常处理" + ex.Message);
            }
        }

        // 电机下电
        public void connect_power_down()
        {
            try
            {
                if (controller.OperatingMode == ControllerOperatingMode.Auto)
                {
                    controller.State = ControllerState.MotorsOff;
                    MessageBox.Show("下电成功");
                }
                else
                {
                    MessageBox.Show("请切换到自动模式");
                }

            }
            catch (System.Exception ex)
            {
                MessageBox.Show("异常处理" + ex.Message);
            }
        }

        //程序复位 
        public void connect_reset_program()
        {
            try
            {
                //判断控制器是否是自动模式
                if (controller.OperatingMode == ControllerOperatingMode.Auto)
                {
                    //将控制器里的rapid 系统任务集合提取到  任务队列
                    tasks = controller.Rapid.GetTasks();
                    using (Mastership m = Mastership.Request(controller))
                    {
                        // 将机器人的第一个任务   复位到main
                        tasks[0].ResetProgramPointer();
                        MessageBox.Show("程序已复位");
                    }
                }
                else
                {
                    MessageBox.Show("请切换到自动模式");
                }
            }
            catch (System.InvalidOperationException ex)
            {
                MessageBox.Show("权限被其他客户端占有" + ex.Message);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("异常：" + ex.Message);
            }
        }

        // 检测工件到位 否
        public void Get_work_tool_signal()
        {
            if (controller.IOSystem.GetSignal("di17Feed1PickAllow") != null)
            {
                // 将控制器的  两个信号提取出来
                Work_Tool_sig1 = controller.IOSystem.GetSignal("di17Feed1PickAllow");
                Work_Tool_sig2 = controller.IOSystem.GetSignal("di17Feed1PickAllow");
                // 如果两个工件都到位了就是  真的到位了
                if (Work_Tool_sig1.Value.ToString() == "0" || Work_Tool_sig2.Value.ToString() == "0")
                {
                    opr1.Lab_Work.Text = "工件：已到位";
                    opr1.Lab_Sc.Text = "传送带： 开启";
                }
                else
                {
                    opr1.Lab_Work.Text = "工件：未到位";
                    opr1.Lab_Sc.Text = "传送带： 未开启";
                }

            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        //检测夹具到位  否  启动位置是否符合
        public void Get_Jig_signal()
        {
            if (controller.IOSystem.GetSignal("j1") != null)
            {
                Jig_sig = controller.IOSystem.GetSignal("j1");
                if (Jig_sig.Value.ToString() == "0")
                {
                    opr1.Lab_Jig.Text = "夹具：未夹紧";
                    opr1.Lab_location.Text = "启动位置：符合";
                }
                else
                {
                    opr1.Lab_Jig.Text = "夹具：已夹紧";
                    opr1.Lab_location.Text = "启动位置：不符合";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        //do02RobotCycleOn  do04RobotAutoMode    do00RobotMotorOn  都运行  工作站运行
        //检测工作站是否运行
        public void Detection_working()
        {
            if (controller.IOSystem.GetSignal("do02RobotCycleOn") != null)
            {
                working = controller.IOSystem.GetSignal("do02RobotCycleOn");
                motor = controller.IOSystem.GetSignal("do00RobotMotorOn");
                models = controller.IOSystem.GetSignal("do04RobotAutoMode");
                if (working.Value.ToString() == "1" && motor.Value.ToString() == "1" && models.Value.ToString() == "1")
                {
                    opr1.Lab_workstation_on.Text = "工作站运行状态：已运行";
                }
                else
                {
                    opr1.Lab_workstation_on.Text = "工作站运行状态：未运行";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        // 检测电机是否启动
        public void Detection_motor()
        {
            if (controller.IOSystem.GetSignal("do02RobotCycleOn") != null)
            {

                motor = controller.IOSystem.GetSignal("do00RobotMotorOn");
                if (motor.Value.ToString() == "1")
                {
                    opr1.Lab_motor_on.Text = "电机状态： 上电中";
                }
                else
                {
                    opr1.Lab_motor_on.Text = "电机状态： 下电";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        // 检测机器人是什么模式
        public void Detection_models()
        {
            if (controller.IOSystem.GetSignal("do02RobotCycleOn") != null)
            {
                models = controller.IOSystem.GetSignal("do04RobotAutoMode");
                if (models.Value.ToString() == "1")
                {
                    opr1.Lab_robot_on.Text = "机器人运行状态： 自动模式";
                }
                else
                {
                    opr1.Lab_robot_on.Text = "机器人运行状态： 手动模式";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }
        #endregion  


        /// <summary>
        /// 上位机  事件日志 事件
        /// </summary>
        #region
        // 事件日志
        public void connect_log()
        {
            //将控制器的全部事件日志放入到  eventall去
            EventLogCategory eventsAll = controller.EventLog.GetCategory(0);
            // 清空
            opr1.teB_Event.Text = "";
            //遍历获取事件
            foreach (EventLogMessage emsg in eventsAll.Messages)
            {
                // 定义事件编号
                int eventNo;
                //合成事件编号 
                eventNo = emsg.CategoryId * 10000 + emsg.Number;
                //显示事件   时间   编号  事件代码  事件 
                opr1.teB_Event.Text = opr1.teB_Event.Text + emsg.Timestamp
                    + "  " + eventNo.ToString() + "  " + emsg.Title + "   " + "\r\n";

            }
        }


        //动作事件筛选
        public void log_screening_1()
        {
            //将控制器的全部事件日志放入到  eventall去
            EventLogCategory eventsAll = controller.EventLog.GetCategory(0);
            //遍历获取事件
            foreach (EventLogMessage emsg in eventsAll.Messages)
            {
                // 定义事件编号
                int eventNo;
                //合成事件编号 
                eventNo = emsg.CategoryId * 10000 + emsg.Number;
                if (eventNo.ToString().Substring(0, 1).Equals("5"))
                {
                    //显示事件   时间   编号  事件代码  事件 
                    opr1.teb_event2.Text = opr1.teb_event2.Text + emsg.Timestamp
                        + "  " + eventNo.ToString() + "  " + emsg.Title + "   " + "\r\n";
                }
            }
        }

        // 程序事件筛选
        public void log_screening_2()
        {
            //将控制器的全部事件日志放入到  eventall去
            EventLogCategory eventsAll = controller.EventLog.GetCategory(0);
            //遍历获取事件
            foreach (EventLogMessage emsg in eventsAll.Messages)
            {
                // 定义事件编号
                int eventNo;
                //合成事件编号 
                eventNo = emsg.CategoryId * 10000 + emsg.Number;
                if (eventNo.ToString().Substring(0, 1).Equals("4"))
                {
                    //显示事件   时间   编号  事件代码  事件 
                    opr1.teb_event2.Text = opr1.teb_event2.Text + emsg.Timestamp
                        + "  " + eventNo.ToString() + "  " + emsg.Title + "   " + "\r\n";
                }
            }
        }

        // 硬件事件筛选 
        public void log_screening_3()
        {
            //将控制器的全部事件日志放入到  eventall去
            EventLogCategory eventsAll = controller.EventLog.GetCategory(0);
            //遍历获取事件
            foreach (EventLogMessage emsg in eventsAll.Messages)
            {
                // 定义事件编号
                int eventNo;
                //合成事件编号 
                eventNo = emsg.CategoryId * 10000 + emsg.Number;
                if (eventNo.ToString().Substring(0, 1).Equals("3"))
                {
                    //显示事件   时间   编号  事件代码  事件 
                    opr1.teb_event2.Text = opr1.teb_event2.Text + emsg.Timestamp
                        + "  " + eventNo.ToString() + "  " + emsg.Title + "   " + "\r\n";
                }
            }
        }

        // io事件筛选 
        public void log_screening_4()
        {
            //将控制器的全部事件日志放入到  eventall去
            EventLogCategory eventsAll = controller.EventLog.GetCategory(0);
            //遍历获取事件
            foreach (EventLogMessage emsg in eventsAll.Messages)
            {
                // 定义事件编号
                int eventNo;
                //合成事件编号 
                eventNo = emsg.CategoryId * 10000 + emsg.Number;
                if (eventNo.ToString().Substring(0, 1).Equals("7"))
                {
                    //显示事件   时间   编号  事件代码  事件 
                    opr1.teb_event2.Text = opr1.teb_event2.Text + emsg.Timestamp
                        + "  " + eventNo.ToString() + "  " + emsg.Title + "   " + "\r\n";
                }
            }
        }

        //事件日志清空 
        public void connect_log_Clean()
        {
            opr1.teB_Event.Text = "";
            opr1.teb_event2.Text = "";
            opr1.Show();
        }
        #endregion


        /// <summary>
        /// 上位机  排版调整事件的集合 
        /// </summary>
        #region

        //定时器 显示  当前速度
        public void timer_speed()
        {
            opr1.Lab_1.Text = "当前速率: " + controller.MotionSystem.SpeedRatio.ToString() + "%";
            opr1.Lab_speed_2.Text = "当前速率: " + controller.MotionSystem.SpeedRatio.ToString() + "%";
        }

        // 设定 给定的速度 
        public void connect_Speed()
        {
            using (Mastership m = Mastership.Request(controller))
            {
                DialogResult DR = MessageBox.Show("确认修改" + opr1.Lab_3.Text + "吗？", "CONFIRM",
                    MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (DR == DialogResult.OK)
                {
                    controller.MotionSystem.SpeedRatio = opr1.Hsb_speed.Value;
                }
            }
        }


        // 工件排版 工件拾取 检测 信号实时刷新 
        public void Get_Pressure_Singal()
        {
            if (controller.IOSystem.GetSignal("Local_IO_DO01_Vac1ON") != null)
            {
                //从控制器中提取需要的信号暂存到类型为signal的对象dipressureok_s中
                diPressureOK_s = controller.IOSystem.GetSignal("Local_IO_DO01_Vac1ON");
                //将dipressureok中的值转换成字符进行显示 
                if (diPressureOK_s.Value.ToString() == "1")
                {
                    opr1.Lab_pick.Text = "工件拾取：已拾取";
                }
                else
                {
                    opr1.Lab_pick.Text = "工件拾取：未拾取";
                }

            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        // 工件排版 工件放置 检测 信号实时刷新
        public void Put_Pressure_Singal()
        {
            if (controller.IOSystem.GetSignal("Local_IO_DO02_Vac1OFF") != null)
            {
                //从控制器中提取需要的信号暂存到类型为signal的对象dipressureok_s中
                diPressureOK_s = controller.IOSystem.GetSignal("Local_IO_DO02_Vac1OFF");
                //将dipressureok中的值转换成字符进行显示 
                if (diPressureOK_s.Value.ToString() == "1")
                {
                    opr1.Lab_Vac.Text = "工件放置：已放置";
                }
                else
                {
                    opr1.Lab_Vac.Text = "工件放置：未放置";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        //检测机器人左吸盘状态
        public void Detection_left_pick()
        {
            if (controller.IOSystem.GetSignal("do17Feed1PickFin") != null)
            {
                //从控制器中提取需要的信号暂存到类型为signal的对象dipressureok_s中
                doVacuumOn_s = controller.IOSystem.GetSignal("do17Feed1PickFin");
                //将dipressureok中的值转换成字符进行显示 
                if (doVacuumOn_s.Value.ToString() == "1")
                {
                    opr1.Lab_left_pick.Text = "左边吸盘：拾取";
                }
                else
                {
                    opr1.Lab_left_pick.Text = "左边吸盘：放置";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        //检测机器人右吸盘状态
        public void Detection_rigth_pick()
        {
            if (controller.IOSystem.GetSignal("do19Feed2PickFin") != null)
            {
                //从控制器中提取需要的信号暂存到类型为signal的对象dipressureok_s中
                doAiron_s = controller.IOSystem.GetSignal("do19Feed2PickFin");
                //将dipressureok中的值转换成字符进行显示 
                if (doAiron_s.Value.ToString() == "1")
                {
                    opr1.Lab_right_pick.Text = "右边吸盘：拾取";
                }
                else
                {
                    opr1.Lab_right_pick.Text = "右边吸盘：放置";
                }
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        // 机器人左吸盘  拾取
        public void Set_left_pick()
        {
            //从控制器提取信号dovacuumOn到dovacuumon_s
            doVacuumOn_s = controller.IOSystem.GetSignal("do17Feed1PickFin");
            //将 _s 强制类型转换位 _d
            doVacuumOn_d = (DigitalSignal)doVacuumOn_s;
            //对信号进行置位操作
            doVacuumOn_d.Set();

        }

        //机器人左吸盘  放置
        public void Reset_left_pick()
        {
            doVacuumOn_d.Reset();
        }

        // 机器人右吸盘  拾取
        public void Set_rigth_pick()
        {
            if (controller.IOSystem.GetSignal("do19Feed2PickFin") != null)
            {
                //从控制器提取输出信号
                doAiron_s = controller.IOSystem.GetSignal("do19Feed2PickFin");
                doAirOn_d = (DigitalSignal)doAiron_s;
                doAirOn_d.Set();
            }
            else
            {
                MessageBox.Show("信号有误");
            }
        }

        //机器人右吸盘  放置
        public void Reset_rigth_pick()
        {
            if (controller.IOSystem.GetSignal("do26PlaceFinAlone") != null)
            {
                doAirOn_d.Reset();
            }
            else
            {
                MessageBox.Show("信号有误");
            }

        }

        //获取当前机器人目标点位置
        public void Get_targt_position()
        {
            //从机器人控制器将坐标数据p10 赋值到p10_ra
            p10Ra = controller.Rapid.GetRapidData("T_ROB1", "Data", "pPickRdy");
            //将p10_ra的值强制类型转换位robtarget后赋值给p10_ro
            p10_Ro = (RobTarget)p10Ra.Value;
            // 将p10 的 x y z 值转换成文本进行显示
            opr1.Lab_pos_x.Text = "X:" + p10_Ro.Trans.X.ToString();
            opr1.Lab_pos_y.Text = "Y:" + p10_Ro.Trans.Y.ToString();
            opr1.Lab_pos_z.Text = "Z:" + p10_Ro.Trans.Z.ToString();
        }

        //实时获取启动位置坐标坐标
        public void Get_target_auto_position()
        {
            // 获取机器人当前大地坐标数据
            RobTarget aRobottarget = controller.MotionSystem.
                ActiveMechanicalUnit.GetPosition(CoordinateSystemType.World);
            opr1.Lab_now_position_x.Text = "X: " + aRobottarget.Trans.X.ToString(format: "#0.00");
            opr1.Lab_now_position_y.Text = "Y: " + aRobottarget.Trans.Y.ToString(format: "#0.00");
            opr1.Lab_now_position_z.Text = "Z: " + aRobottarget.Trans.Z.ToString(format: "#0.00");


        }

        //设置当前目标点的位置 
        public void Put_target_position()
        {
            // 将原坐标值与偏移量相加后暂存
            float X = p10_Ro.Trans.X + (float)opr1.Num_pos_x.Value;
            float Y = p10_Ro.Trans.Y + (float)opr1.Num_pos_y.Value;
            float Z = p10_Ro.Trans.Z + (float)opr1.Num_pos_z.Value;

            // 将新坐标值显示供确认
            DialogResult Dr = MessageBox.Show("是否修改为新坐标为：" +
                "\r\n" + "X:" + X + "   " + "Y:" + Y + "   " + "Z:" + Z + "   ", "CONFIRM", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);

            // 确认修改后写入流程
            if (Dr == DialogResult.OK)
            {
                try
                {
                    using (Mastership.Request(controller))
                    {
                        //将暂存的坐标值赋值给p10
                        p10_Ro.Trans.X = X;
                        p10_Ro.Trans.Y = Y;
                        p10_Ro.Trans.Z = Z;
                        p10Ra.Value = p10_Ro;
                    }
                    //将修改值后更新一次坐标数值显示
                    p10Ra = controller.Rapid.GetRapidData("T_ROB1", "Data", "pPickRdy");
                    p10_Ro = (RobTarget)p10Ra.Value;

                    opr1.Lab_pos_x.Text = "X:" + p10_Ro.Trans.X.ToString();
                    opr1.Lab_pos_y.Text = "Y:" + p10_Ro.Trans.Y.ToString();
                    opr1.Lab_pos_z.Text = "Z:" + p10_Ro.Trans.Z.ToString();

                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }

            }
            //将偏移数 归零
            opr1.Num_pos_x.Value = 0;
            opr1.Num_pos_y.Value = 0;
            opr1.Num_pos_z.Value = 0;
        }

        // 实时获取机器人关机角度坐标系 
        public void GetRobotAngel()
        {
            //获取机器人整体关节坐标  分别赋予各个关节
            JointTarget jointTargetAngel = controller.MotionSystem.ActiveMechanicalUnit.GetPosition();
            opr1.Lab_angel_1.Text = "Axis1：" + jointTargetAngel.RobAx.Rax_1.ToString(format: "#0.00");
            opr1.Lab_angel_2.Text = "Axis2：" + jointTargetAngel.RobAx.Rax_2.ToString(format: "#0.00");
            opr1.Lab_angel_3.Text = "Axis3：" + jointTargetAngel.RobAx.Rax_3.ToString(format: "#0.00");
            opr1.Lab_angel_4.Text = "Axis4：" + jointTargetAngel.RobAx.Rax_4.ToString(format: "#0.00");
            opr1.Lab_angel_5.Text = "Axis5：" + jointTargetAngel.RobAx.Rax_5.ToString(format: "#0.00");
            opr1.Lab_angel_6.Text = "Axis6：" + jointTargetAngel.RobAx.Rax_6.ToString(format: "#0.00");

        }

        // 实时获取机器人大地坐标系
        public void GetRobotworldPosition()
        {
            // 存放欧拉里角数据
            double Rx; double Ry; double Rz;

            // 获取机器人当前大地坐标数据
            RobTarget aRobottarget = controller.MotionSystem.
                ActiveMechanicalUnit.GetPosition(CoordinateSystemType.World);
            opr1.Lab_point_x.Text = "X: " + aRobottarget.Trans.X.ToString(format: "#0.00");
            opr1.Lab_point_y.Text = "Y: " + aRobottarget.Trans.Y.ToString(format: "#0.00");
            opr1.Lab_point_z.Text = "Z: " + aRobottarget.Trans.Z.ToString(format: "#0.00");

            // 将描述姿态的四元数 转换成欧拉角表示
            aRobottarget.Rot.ToEulerAngles(out Rx, out Ry, out Rz);
            opr1.Lab_point_Rx.Text = "Rx: " + Rx.ToString(format: "#0.00");
            opr1.Lab_point_Ry.Text = "Ry: " + Ry.ToString(format: "#0.00");
            opr1.Lab_point_Rz.Text = "Rz: " + Rz.ToString(format: "#0.00");

        }
        #endregion


        /// <summary>
        /// 上位机 预防维护 事件
        /// </summary>
        #region
        // 备份 
        public void Put_save__file()
        {
            try
            {
                //获取控制器的用户管理信息
                UserAuthorizationSystem UAS = controller.AuthenticationSystem;
                // 检查当前登陆用户是否拥有备份权限
                if (UAS.CheckDemandGrant(Grant.BackupController))
                {
                    //将输入到teb 中的文本作为备份的目录
                    controller.Backup(opr1.teB_save.Text + ".");
                    MessageBox.Show("成功备份到：" + opr1.teB_save.Text + ".");
                }
                else
                {
                    MessageBox.Show("没有备份权限，请先获取备份权限！");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        //记录 预防维护的项目 
        public void Set_write_Maintenance()
        {

            if (opr1.checkBox1.Checked || opr1.checkBox3.Checked || opr1.checkBox4.Checked || opr1.checkBox5.Checked ||
                opr1.checkBox6.Checked || opr1.checkBox7.Checked || opr1.checkBox8.Checked || opr1.checkBox9.Checked)
            {
                string temp = DateTime.Now.ToString();
                if (opr1.checkBox1.Checked)
                {
                    maintenance = "检查示教/控制器";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("每日一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox3.Checked)
                {
                    maintenance = "检查安全防护";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("每日一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox4.Checked)
                {
                    maintenance = "检查按钮/开关";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("每日一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox5.Checked)
                {
                    maintenance = "散热风扇-检测";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("六月一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox6.Checked)
                {
                    maintenance = "清洁示教器";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("一月一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox7.Checked)
                {
                    maintenance = "散热风扇-清洁";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("六月一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox8.Checked)
                {
                    maintenance = "控制柜清洁";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("每年一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                if (opr1.checkBox9.Checked)
                {
                    maintenance = "检查安全回路";
                    ListViewItem item = new ListViewItem(temp);
                    item.SubItems.Add(maintenance);
                    item.SubItems.Add("每年一次");
                    opr1.Lsv_file.Items.Add(item);
                }
                //选项复原
                opr1.checkBox1.Checked = false;
                opr1.checkBox3.Checked = false;
                opr1.checkBox4.Checked = false;
                opr1.checkBox5.Checked = false;
                opr1.checkBox6.Checked = false;
                opr1.checkBox7.Checked = false;
                opr1.checkBox8.Checked = false;
                opr1.checkBox9.Checked = false;

            }
            else
            {
                MessageBox.Show("请选择需要维护的项目，可以同时多选");
            }

        }

        // 保存预防维护的项目
        public void Set_write_file()
        {
            SaveFileDialog sFD1 = new SaveFileDialog();
            sFD1.InitialDirectory = "E:\\abb-save";
            sFD1.Filter = "txt files(*.txt)|*.txt|All files(*.*)|*.*";  //保存文件的格式
            sFD1.FilterIndex = 1;
            sFD1.RestoreDirectory = true;
            if (sFD1.ShowDialog() == DialogResult.OK)
            {
                string s = "";
                for (int m = 0; m < opr1.Lsv_file.Items.Count; m++)  //所有项的集合数
                {
                    for (int n = 0; n < opr1.Lsv_file.Items[m].SubItems.Count; n++)   // 一个项的所有子项集合数 
                    {
                        s += opr1.Lsv_file.Items[m].SubItems[n].Text + "    ";
                    }
                    s += "\r\n";
                }
                using (StreamWriter sw = new StreamWriter(sFD1.FileName))
                {
                    sw.WriteLine(s);   //在文件中添加文本
                }
                MessageBox.Show("成功保存文件：" + sFD1.FileName);
                opr1.Lsv_file.Items.Clear();
            }

        }

        // 打开 原先保存的预防维护文件 
        public void Get_open_file()
        {
            opr1.Lsv_file.Items.Clear(); //先清空listview1中所有数据
            OpenFileDialog oFD1 = new OpenFileDialog();
            oFD1.InitialDirectory = "E:\\abb-save";   //显示初始目录，
            oFD1.Filter = "txt files(*.txt)|*.txt|All files(*.*)|*.*";   //文件名筛选字符串
            oFD1.FilterIndex = 2;
            oFD1.RestoreDirectory = true;
            //若用户在对话框中单击确定，则结果为DialogResult.OK
            //否则结果为DialogResult.Cancel

            if (oFD1.ShowDialog() == DialogResult.OK)       //打开文件
            {
                MessageBox.Show("成功打开文件：" + oFD1.FileName);    //显示选择的文件名
                FileStream fs = new FileStream(oFD1.FileName, FileMode.Open);  //需添加头文件system.IO
                StreamReader s1 = new StreamReader(fs, Encoding.ASCII);
                string str1 = s1.ReadLine();   //读取一行字符
                if (str1 == null)
                {
                    MessageBox.Show("选定文件不存在或文件格式有误");
                }
                else
                {               // 重定向到windows 记事本程序去        
                    System.Diagnostics.Process.Start("explorer.exe", oFD1.FileName);
                }
            }
        }

        #endregion


        /// <summary>
        ///   上位机 生产数据监控事件
        /// </summary>
        #region
        // 系统事件   写入lisv中  自动订阅 
        public void msg_update(object sender, MessageWrittenEventArgs e)
        {
            // 将更新的报警信息时间 放入item 第一列
            ListViewItem item = new ListViewItem(e.Message.Timestamp.ToString());
            //将更新的报警信息标题放入  第二列
            item.SubItems.Add(e.Message.Title);
            //将对象中所有的内容加载到liv
            opr1.Lsv_sy_get.Items.Add(item);
        }

        // 信号 订阅  更新 
        public void Di_update(object sender, SignalChangedEventArgs e)
        {
            //防止线程冲突 使用Invoke方法更新控件leb的值
            opr1.Invoke(new Action(() =>
            {
                //使用lamda表达式 快捷操作 

            }));
        }

        //  系统事件 自动订阅 
        public void flow_get()
        {
            //实例化一个  eventlog类型的对象log 将当前控制器 中的事件提取出来
            EventLog log = controller.EventLog;
            //提交一个机器人系统新信息的订阅
            log.MessageWritten += new EventHandler<MessageWrittenEventArgs>(msg_update);


            //从控制器中提取需要的信号放入类型为singal 的对象dipressureok 中  只能获取控制器的
            //di_jig = controller.IOSystem.GetSignal("dj1");
            ////提交一个机器人io状态更新的订阅
            //di_jig.Changed += new EventHandler<SignalChangedEventArgs>(Di_update);

        }

        // 实时显示程序已经运行的时间 
        public int secCount = 0;
        public int miCount = 0;
        public int hoCount = 0;

        // 定时器计时 进位
        public int Time_to_run()
        {
            secCount += 1;
            if (secCount == 60)
            {
                secCount = 0;
                miCount += 1;
            }
            return secCount;
        }

        public int Time_to_run_2()
        {
            if (miCount == 60)
            {
                miCount = 0;
                hoCount += 1;
            }
            return miCount;
        }

        public int Time_to_run_3()
        {
            return hoCount;
        }

        int a = 1;
        int b1 = 0;
        // 生产数量统计  模拟真实生产情况  每隔多少时间或产品后产生一个不良品
        public void Count_Production()
        {
            count_Production = controller.IOSystem.GetSignal("do26PlaceFinAlone");

            if (count_Production.Value.ToString() == "1")
            {
                a += 1;
                opr1.Lab_Production.Text = "产量统计: 已生产：" + a + "个";
                if (a == 200)
                {
                    b1 += 1;
                }
            }
        }

        // 生产率 统计 
        public void Count_Productivity()
        {
            double b = 800;
            b = (a + b1) / b;
            opr1.Lab_Productivity.Text = "生产率:  " + b + "%";
        }

        //生产良率
        public void Count_good_Productivity()
        {
            double b;
            b = (double)a / (a + b1) * 100;
            opr1.Lab_Percent_pass.Text = "生产良率：" + b + "%";
        }

        //不合格数量
        public void Count_low()
        {
            opr1.label15.Text = "不合格个数:  " + b1 + "个";
        }



        #endregion
        #endregion


        /// <summary>
        ///   上位机   管理员权限  
        /// </summary>
        #region

        // 管理员界面扫描 网络端口 
        public void connect_refresh_adm()
        {
            //方法scan 用于扫描网络并将所有控制器信息加载到内存
            scanner.Scan();
            adm.lsV_adm.Items.Clear();

            ControllerInfoCollection controls = scanner.Controllers;

            foreach (ControllerInfo info in controls)
            {
                //将listviewitem类实例化一个对像 将info作为成员一
                ListViewItem item = new ListViewItem(info.SystemName);
                //将info属性ip地址   转换字符串类型 
                item.SubItems.Add(info.IPAddress.ToString());
                item.SubItems.Add(info.Version.ToString());
                item.SubItems.Add(info.IsVirtual.ToString());

                string a1 = DateTime.Now.ToString();
                item.SubItems.Add(a1);
                item.Tag = info;
                //将信息加载到ui上
                adm.lsV_adm.Items.Add(item);
            }
            //显示信息到界面上去 
            adm.Show();
        }

        // 点击虚拟控制器名称然后连接 
        public void connect_click_connect_adm()
        {
            ListViewItem item = adm.lsV_adm.SelectedItems[0];
            if (adm.lsV_adm.Items.Count > 0)
            {
                if (item.Tag != null)
                {
                    ControllerInfo info = (ControllerInfo)item.Tag;
                    if (info.Availability == Availability.Available)
                    {
                        if (controller != null)
                        {
                            controller.Logoff();
                            controller.Dispose();
                            controller = null;
                            //如果contro 不为空 退出 在登陆
                        }
                        //  使用默认用户名登入 
                        controller = ControllerFactory.CreateFrom(info);
                        controller.Logon(UserInfo.DefaultUser);

                        MessageBox.Show("已成功登陆控制器" + info.SystemName);
                    }
                    else
                    {
                        MessageBox.Show("登陆失败");
                    }
                }
            }
            adm.lsV_adm.Show();
        }

        // 获取机器人所有信号io的状态
        public void Get_singnal_all()
        {
            singnls_all = controller.IOSystem.GetSignals(IOFilterTypes.Unit, "PN_Internal_Device");
            if (singnls_all != null)
            {
                foreach (Signal signal in singnls_all)
                {
                    ListViewItem item = new ListViewItem(signal.Name);
                    item.SubItems.Add(signal.Type.ToString());
                    item.SubItems.Add(signal.Value.ToString());
                    item.SubItems.Add(signal.Unit.ToString());
                    adm.Lsv_io.Items.Add(item);
                }
                if (adm.Teb_io_name_get.Text.ToString() != "")
                {
                    Jig_sig = controller.IOSystem.GetSignal(adm.Teb_io_name_get.Text.ToString());
                    if (Jig_sig.Value.ToString() != null)
                    {
                        adm.Lab_io.Text = "io值为： " + Jig_sig.Value.ToString();
                    }
                    else
                    {
                        MessageBox.Show("输入的信号有误!");
                    }

                }
                else
                {
                    MessageBox.Show("输入的信号名称为空!");
                }


            }
            else
            {
                MessageBox.Show("设备不对，获取不到信号的值");
            }
        }

        //设置 io名称 信号的值为 1   初始信号值为0 set 为 1
        public void Set_io_1()
        {
            if (adm.Teb_io_name_set.Text!="")
            {     
                Set_io = controller.IOSystem.GetSignal(adm.Teb_io_name_set.Text.ToString());  
                Set_io_D = (DigitalSignal)Set_io;
                Set_io_D.Set();
            }
            else
            {
                MessageBox.Show("没有输入信号名称，无法获取信号的值");
            }
        }

        //设置 io名称 信号的值为0
        public void Set_io_0()
        {
            if (adm.Teb_io_name_set.Text != "")
            {
                Set_io_D.Reset();
            }
            else
            {
                MessageBox.Show("没有输入信号名称，无法获取信号的值");
            }
        }

        // 从机器人控制器传输文件到pc
        public void Seed_adm_File_Pc()
        {
            string remoteDir = controller.FileSystem.RemoteDirectory;
            //得到机器人控制器的路径信息   默认为机器人控制器home目录
            string localDir = controller.FileSystem.LocalDirectory;
            //使用getfile 指令将机器人控制器的文件传输到pc
            //    controller.FileSystem.GetFile(adm.teb_save_mod.Text, localDir);
            MessageBox.Show("modele文件备份成功");
        }

        //从pc传输文件到机器人控制器
        public void Seed_adm_robot()
        {
            string remoteDir = controller.FileSystem.RemoteDirectory;
            //得到机器人控制器的路径信息   默认为机器人控制器home目录
            string localDir = controller.FileSystem.LocalDirectory;

            string strFileFullName = "";
            string strFileName = "";
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "RAPID 文件（*.mod;.sys)|*.mod;*.sys|所有文件|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                strFileFullName = ofd.FileName;
                strFileName = ofd.SafeFileName;
            }
            try
            {
                if (controller.FileSystem.FileExists("/test/module3.mod"))
                {
                    //使用put向控制器传输文件
                    controller.FileSystem.PutFile(strFileFullName, "/test/" + strFileName, true);
                    MessageBox.Show("替换" + strFileName + "到home文件夹成功");
                }
                else
                {
                    controller.FileSystem.PutFile(strFileFullName, "/test/" + strFileName);
                    MessageBox.Show("上传" + strFileName + "到home文件夹成功");
                }
            }
            catch (Exception rx)
            {

                MessageBox.Show(rx.ToString());
            }
        }

        // 获取系统配置信息
        public void Get_adm_sy()
        {
            adm.teB_sy_info.AppendText("系统名：" + controller.RobotWare.Name.ToString() + "\r\n");
            adm.teB_sy_info.AppendText("RW版本：" + controller.RobotWare.Version.ToString()+"\r\n");
            RobotWareOptionCollection rwop = controller.RobotWare.Options;
            // 获取当前系统所有选项信息
            foreach (RobotWareOption op in rwop)
            {
                adm.teB_sy_info.AppendText("   option：" + op.ToString() + "\r\n");
            }
        }

        // 获取控制器运行 信息
        public void Get_adm_run()
        {
            MechanicalUnitServiceInfo m =controller.MotionSystem.ActiveMechanicalUnit.ServiceInfo;
            //创建当前机械单元的serviceinfo 实例
            adm.teb_run_time.AppendText("生产总时间："
                +m.ElapsedProductionTime.TotalHours.ToString()+"小时\r\n");
            adm.teb_run_time.AppendText("自上次服务后的生产总时间：" 
                + m.ElapsedProductionTimeSinceLastService.TotalHours.ToString() + "小时\r\n");
            adm.teb_run_time.AppendText("上次开机：" + m.LastStart.ToString() + "\r\n");
            //创建机器人主机信息实例
            MainComputerServiceInfo m1=controller.MainComputerServiceInfo;
            adm.teb_run_time.AppendText("主机CPU温度：" + m1.Temperature.ToString() + "\r\n");
            adm.teb_run_time.AppendText("主机CPU信息：" +m1.CpuInfo.ToString()  + "\r\n");
            adm.teb_run_time.AppendText("主机CPU温度：" +m1.RamSize.ToString() +"\r\n");
        }

        // 控制器远程重启
        public void Restart_amd()
        {
            try
            {
                using (Mastership m = Mastership.Request(controller))
                {
                    MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
                    DialogResult dr = MessageBox.Show("确定要重启吗?", "控制器重启", messButton);
                    if (dr == DialogResult.OK)
                    {
                        controller.Restart();
                    }

                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        //控制器备份
        public void Save_amd()
        {
            try
            {
                //获取控制器的用户管理信息
                UserAuthorizationSystem UAS = controller.AuthenticationSystem;
                // 检查当前登陆用户是否拥有备份权限
                if (UAS.CheckDemandGrant(Grant.BackupController))
                {
                    //将输入到teb 中的文本作为备份的目录
                    controller.Backup(adm.teB_save_adm.Text + ".");
                    MessageBox.Show("成功备份到：" + adm.teB_save_adm.Text + ".");
                }
                else
                {
                    MessageBox.Show("没有备份权限，请先获取备份权限！");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        #endregion
    }
}

